#-*- codeing = utf-8 -*-
#@Time : 2020/9/10 0:08
#@Author : 阳某
#@File : 深浅copy.py
#@Software : PyCharm
# == 是用来比较两个对象的值是否相等
a = '123'
b = '123'
print(a == b)
# is 也被叫做同一性运算符，这个运算符比较判断的事对象间的唯一身份标识，也就是id是否相同
a = b = ['123456']
c = ['123456']
print(a == b ,id(a),id(b))
print(a == c ,id(a),id(c))
print(a is b,id(a),id(b))
print(a is c, id(a),id(b))
# a,b都为数值时
a = 1
b = 1
print(id(a),id(b))
print(a == b,a is b)
# a,b都为字符串时
a='abcd'
b='abcd'
print(id(a),id(b))
print(a == b,a is b)
print('**********')
# a,b都为列表时
a = ['1234']
b= ['1234']
print(id(a),id(b))
print(a == b,a is b)
# a,b都为字典时
a = {'a':1,'b':2}
b = {'a':1,'b':2}
print(id(a),id(b))
print(a == b,a is b)

# a,b都为元组时
a = (1,2,3)
b = (1,2,3)
print(id(a),id(b))
print(a == b,a is b)

# a,b都是集合时
a = set([1,2,3])
b = set([1,2,3])
print(id(a),id(b))
print(a == b,a is b)

# 关于深浅拷贝
print('关于深浅拷贝1')
a = [1,2,3]
b = a
a.append([4,5,6])
print(a)
print(b)
print(a is b,a == b)    #a把值赋给了b，b对象又指向了a对象的内存，也就是说a，b只想同一块内存空间

print('关于深浅拷贝2')
a = [1,2,3]
b = a
a = [4,5,6]     #a又开辟了新的内存空间
print(a)
print(b)
print(a is b,a == b)

# 数值，字符串，元组的深浅拷贝是没有差别的
import copy
a = '12345'
b = copy.copy(a)
c=copy.deepcopy(a)
print(id(a),id(b),id(c))

a = 12345
b = copy.copy(a)
c=copy.deepcopy(a)
print(id(a),id(b),id(c))

a = (1,2,3)
b = copy.copy(a)
c=copy.deepcopy(a)
print(id(a),id(b),id(c))

# 列表
a = [1,2,3]
b = copy.copy(a)
c=copy.deepcopy(a)
print(id(a),id(b),id(c))

# 字典
a = {"a":"1","b":2,"c":["c",3]}
b = copy.copy(a)
c = copy.deepcopy(a)
print(a,b,c)
print(id(a),id(b),id(c))
a['c'] = '666'
print(a,b,c)
print(id(a),id(b),id(c))

'''
浅copy：不管多么复杂的数据结构，浅拷贝都只会copy一层，
且当指向不可变类型时，copy不会执行copy操作，当指向可变的数据类型时，会执行第一层拷贝，即拷贝浅层的指向
深copy：就是在内存中重新开辟一块内存空间，不管数据结构多复杂，只要遇到可能发生改变的数据类型，就重新
开辟一块内存空间把内容赋值下来，直到最后一层，不再有复杂的数据结构，就保持其原因用。
这样，不管数据结构多么的复杂，数据之间的修改都不会相互影响，这就是深拷贝，也同样可以将深拷贝理解成真正意义上的复制，是操作两个独立的个体
'''
